package jdx_05_synchronized.jdx_05_可重入;

/*
[可重入锁]
(1).如果没有可重入的概念，那么当两个方法都被加锁之后，其中一个方法调用
另一个方法时，由于拿不到锁，而导致死锁现象

(2).正因为 synchronized 可重入，此时其中的一个方法才能调用另一个方法

 */
public class T1 {
    public synchronized static void m1(){
        System.out.println("线程1.Start..........");
        try {
            Thread.sleep(300);
            m2();
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程1.End..........");
    }

    public synchronized static void m2(){
        System.out.println("线程2.Start..........");
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("线程2.End..........");
    }

    public static void main(String[] args) {
        m1();
    }

}
/*
[问题]:为什么synchronized必须是可重入的?

上面的代码已经模拟了这样的情况，现在假设
m1是父类的方法，自然也是对父类的对象加锁
m2是子类的方法，自然是对子类的对象加锁

如果此时，synchronized是不可重入的，那么子类的 m1 使用 super 调用父类的 m2 方法的时候
由于拿不到父类的锁，就会陷入死锁的状态

所以 synchronized 必须是可重入的。

 */
